#ifndef __WIZ_DATATYPE_UTF8_HPP__SHANHAOBO_19800429__
#define __WIZ_DATATYPE_UTF8_HPP__SHANHAOBO_19800429__

#include "./WizDataTypeUTF.hpp"

namespace Wiz
{
    namespace UTF8
	{
        namespace String
        {
            typedef ::std::basic_string<::Wiz::UTF8::Char::Type, ::std::char_traits<::Wiz::UTF8::Char::Type>, ::std::allocator<::Wiz::UTF8::Char::Type>> Base;
            class WIZ_EXPORT Type : public ::Wiz::Base::TString::Type<::Wiz::UTF8::String::Base>
            {
                typedef ::Wiz::Base::TString::Type<::Wiz::UTF8::String::Base> tSuper;
            public:
                Type() : tSuper()
                {
                }

                explicit Type(::Wiz::WString::In WStr)
                {
                    this->From(WStr);
                }

                Type(::Wiz::String::In Str, ::Wiz::Char::InPtr CP = "")
                {
                    this->From(Str, CP);
                }

                Type(::Wiz::String::Char::InPtr _Ptr, ::Wiz::Char::InPtr CP = "")
                {
                    this->From(_Ptr, CP);
                }

                Type(const tChar* _Ptr) : tSuper( _Ptr )
                {
                }

                explicit Type(tThisIn _Right ) : tSuper( _Right )
                {
                }

                Type( tThisIn _Right, tSize _Roff, tSize _Count = npos ) : tSuper( _Right, _Roff, _Count )
                {
                }

                Type( const tChar* _Ptr, tSize _Count ) : tSuper( _Ptr, _Count )
                {
                }

                Type( const tChar* first, const tChar* last ) : tSuper( first, last )
                {
                }
            public:
                ::Wiz::Void::Type From(::Wiz::WString::In WStr);
                ::Wiz::Void::Type From(::Wiz::UTF16::String::In U16Str);
                ::Wiz::Void::Type From(::Wiz::UTF32::String::In U32Str);
                ::Wiz::Void::Type From(::Wiz::String::In Str,  ::Wiz::Char::InPtr CP = "");

                ::Wiz::Void::Type From(::Wiz::WChar::InPtr WStrPtr, ::Wiz::Size::In Len = 0);
                ::Wiz::Void::Type From(::Wiz::UTF16::Char::InPtr U16Ptr, ::Wiz::Size::In Len = 0);
                ::Wiz::Void::Type From(::Wiz::UTF32::Char::InPtr U32Ptr, ::Wiz::Size::In Len = 0);
                ::Wiz::Void::Type From(::Wiz::Char::InPtr StrPtr, ::Wiz::Size::In Len = 0, ::Wiz::Char::InPtr CP = "");
            public:
                ::Wiz::WChar::ConstPtr To(::Wiz::WString::Out WStr) const;
                ::Wiz::Char::ConstPtr  To(::Wiz::String::Out Str, ::Wiz::Char::InPtr CP = "") const;
            };
            WIZ_DECLARE(::Wiz::UTF8::String::Type);
        } /// end of namespace String
    } /// end of namespace UTF8
} /// end of namespace Wiz

#endif /*__WIZ_DATATYPE_UTF8_HPP__SHANHAOBO_19800429__*/
